home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 20 / Cream of the Crop 20 (Terry Blount) (1996).iso / program / kh_gdi.zip / APXPREV.CPP < prev    next >
C/C++ Source or Header  |  1996-05-27  |  9KB  |  309 lines

  1. /*  Project slang
  2.     
  3.     Copyright ⌐ 1995. All Rights Reserved.
  4.  
  5.     SUBSYSTEM:    slang.exe Application
  6.     FILE:         APXPrev.CPP
  7.     AUTHOR:       Stepan S.Vartanov
  8.  
  9.  
  10.     OVERVIEW
  11.     ========
  12.     Source file for implementation of Print Preview.      
  13. */
  14.  
  15.  
  16. #include <owl\owlpch.h>
  17. #pragma hdrstop
  18.  
  19. #include "apxprev.h"
  20.  
  21. #include "slangapp.rh"
  22.  
  23.  
  24. //{{PreviewWindow Implementation}}
  25.  
  26. DEFINE_RESPONSE_TABLE1(PreviewWindow, TDecoratedFrame)
  27.     EV_COMMAND_ENABLE(APX_PPR_PREVIOUS, PPR_PreviousEnable),
  28.     EV_COMMAND_ENABLE(APX_PPR_NEXT, PPR_NextEnable),
  29.     EV_COMMAND(APX_PPR_PREVIOUS, PPR_Previous),
  30.     EV_COMMAND(APX_PPR_NEXT, PPR_Next),
  31.     EV_COMMAND(APX_PPR_ONEUP, PPR_OneUp),
  32.     EV_COMMAND_ENABLE(APX_PPR_TWOUP, PPR_TwoUpEnable),
  33.     EV_COMMAND(APX_PPR_TWOUP, PPR_TwoUp),
  34.     EV_COMMAND(APX_PPR_DONE, PPR_Done),
  35.     EV_COMMAND(CM_FILEPRINT, CmPrint),
  36.     EV_COMMAND_ENABLE(CM_FILEPRINT, CmPrintEnable),
  37. //{{PreviewWindowRSP_TBL_BEGIN}}
  38. //{{PreviewWindowRSP_TBL_END}}
  39. END_RESPONSE_TABLE;
  40.  
  41.  
  42. PreviewWindow::PreviewWindow (TWindow *parentWindow, TPrinter *printer, TWindow* currWindow, const char far* title, TLayoutWindow* client) :
  43.                  TDecoratedFrame(parentWindow, title, client)
  44. {
  45.     CurrWindow = currWindow;
  46.     Printer = printer;
  47.     Client = client;
  48.     Page1 = 0;
  49.     Page2 = 0;
  50.  
  51.     TPrintDialog::TData& data = Printer->GetSetup();
  52.     PrnDC = new TPrintDC(data.GetDriverName(),
  53.                          data.GetDeviceName(),
  54.                          data.GetOutputName(),
  55.                          data.GetDevMode());
  56.  
  57.     PrintExtent = new TSize(PrnDC->GetDeviceCaps(HORZRES), PrnDC->GetDeviceCaps(VERTRES));
  58.     Printout = new APXPrintOut(Printer, "Print Preview", currWindow, true);
  59.  
  60.     SetBkgndColor(::GetSysColor(COLOR_APPWORKSPACE));
  61.  
  62.     //
  63.     // Create default toolbar New and associate toolbar buttons with commands.
  64.     //
  65.     PreviewSpeedBar = new TControlBar(this);
  66.     PreviewSpeedBar->Insert(*new TButtonGadget(APX_PPR_PREVIOUS, APX_PPR_PREVIOUS, TButtonGadget::Command, true));
  67.     PreviewSpeedBar->Insert(*new TButtonGadget(APX_PPR_NEXT, APX_PPR_NEXT, TButtonGadget::Command, true));
  68.     PreviewSpeedBar->Insert(*new TSeparatorGadget(6));
  69.     PreviewSpeedBar->Insert(*new TButtonGadget(APX_PPR_ONEUP, APX_PPR_ONEUP, TButtonGadget::Exclusive, true, TButtonGadget::Down));
  70.     PreviewSpeedBar->Insert(*new TButtonGadget(APX_PPR_TWOUP, APX_PPR_TWOUP, TButtonGadget::Exclusive, true));
  71.     PreviewSpeedBar->Insert(*new TSeparatorGadget(12));
  72.     PreviewSpeedBar->Insert(*new TTextGadget(APX_PPR_CURRPAGE, TGadget::Recessed, TTextGadget::Left, 10, "Page 1"));
  73.     PreviewSpeedBar->Insert(*new TSeparatorGadget(20));
  74.     PreviewSpeedBar->Insert(*new TButtonGadget(CM_FILEPRINT, CM_FILEPRINT, TButtonGadget::Command, true));
  75.     PreviewSpeedBar->Insert(*new TSeparatorGadget(20));
  76.     PreviewSpeedBar->Insert(*new TButtonGadget(APX_PPR_DONE, APX_PPR_DONE, TButtonGadget::Command, true));
  77.     Insert(*PreviewSpeedBar, TDecoratedFrame::Top);
  78.  
  79.     // We want a window that cannot be sized, maximized, or minimized.
  80.     Attr.Style = (WS_VISIBLE | WS_POPUP);
  81.  
  82.     // Don't show the border of the preview window.
  83.     Attr.X = 0;
  84.     Attr.Y = -1;
  85.     Attr.W = Parent->GetClientRect().Width();
  86.     Attr.H = Parent->GetClientRect().Height() + 1;
  87.     parentWindow->MapWindowPoints(HWindow, (TPoint *)&(Attr.X), 1);
  88. }
  89.  
  90.  
  91. PreviewWindow::~PreviewWindow ()
  92. {
  93.     delete Page1;
  94.     Page1 = 0;
  95.     delete Page2;
  96.     Page2 = 0;
  97.  
  98.     delete PrnDC;
  99.     PrnDC = 0;
  100.     delete PrintExtent;
  101.     PrintExtent = 0;
  102.     delete Printout;
  103.     Printout = 0;
  104. }
  105.  
  106.  
  107. void PreviewWindow::SetupWindow ()
  108. {
  109.     TDecoratedFrame::SetupWindow();
  110.  
  111.     TPrintDialog::TData& data = Printer->GetSetup();
  112.     Page1 = new TPreviewPage(Client, *Printout, *PrnDC, *PrintExtent, 1);
  113.     Page1->SetPageNumber(1);
  114.     data.FromPage = 1;
  115.     data.ToPage = 1;
  116.     data.MinPage = 1;
  117.     data.MaxPage = 1;
  118.  
  119.     Page2 = 0;
  120.  
  121.     TLayoutMetrics metrics1;
  122.  
  123.     metrics1.X.Set(lmLeft, lmRightOf, lmParent, lmLeft, 15);
  124.     metrics1.Y.Set(lmTop, lmBelow, lmParent, lmTop, 15);
  125.  
  126.     //
  127.     // Determine major axis of preview page, have that follow parent size.
  128.     // Make minor axis a percentage (aspect ratio) of the page's major axis
  129.     //
  130.     TRect r = Client->GetClientRect();
  131.     long ratio;
  132.  
  133.     if (PrintExtent->cx > PrintExtent->cy)
  134.         ratio = ((long)PrintExtent->cy * 100) / PrintExtent->cx;
  135.     else
  136.         ratio = ((long)PrintExtent->cx * 100) / PrintExtent->cy;
  137.  
  138.     bool xMajor = (((r.Width() * ratio) / 100) > r.Height());
  139.     if (xMajor){
  140.         metrics1.Height.Set(lmBottom, lmAbove, lmParent, lmBottom, 15);
  141.         metrics1.Width.PercentOf(Page1, (int)((long)PrintExtent->cx * 95 / PrintExtent->cy), lmHeight);
  142.     } else {
  143.         metrics1.Height.PercentOf(Page1, (int)((long)PrintExtent->cy * 95 / PrintExtent->cx), lmWidth);
  144.         metrics1.Width.Set(lmRight, lmLeftOf, lmParent, lmRight, 15);
  145.     }
  146.  
  147.     Page1->Create();
  148.  
  149.     Client->SetChildLayoutMetrics(*Page1, metrics1);
  150.     Client->Layout();
  151. }
  152.  
  153.  
  154. void PreviewWindow::SpeedBarState ()
  155. {
  156.     TPrintDialog::TData &printerData = Printer->GetSetup();
  157.  
  158.     // Update the page count.
  159.     TTextGadget *theTGadget = TYPESAFE_DOWNCAST(PreviewSpeedBar->GadgetWithId(APX_PPR_CURRPAGE), TTextGadget);
  160.     if (theTGadget) {
  161.         char    buffer[32];
  162.         if (Page2 && (printerData.FromPage != printerData.ToPage))
  163.             wsprintf(buffer, "Page %d - %d", printerData.FromPage, printerData.ToPage);
  164.         else
  165.             wsprintf(buffer, "Page %d", printerData.FromPage);
  166.         theTGadget->SetText(buffer);
  167.     }
  168. }
  169.  
  170.  
  171. void PreviewWindow::PPR_PreviousEnable (TCommandEnabler &tce)
  172. {
  173.     // Only have previous on if we're not at the first page.
  174.     TPrintDialog::TData &printerData = Printer->GetSetup();
  175.     tce.Enable(printerData.FromPage != 1);
  176. }
  177.  
  178.  
  179. void PreviewWindow::PPR_NextEnable (TCommandEnabler &tce)
  180. {
  181.     // Only have next on if we're not at the last page.
  182.     TPrintDialog::TData &printerData = Printer->GetSetup();
  183.     tce.Enable(printerData.ToPage != printerData.MaxPage);
  184. }
  185.  
  186.  
  187. void PreviewWindow::PPR_Previous ()
  188. {
  189.     TPrintDialog::TData &printerData = Printer->GetSetup();
  190.  
  191.     if (printerData.FromPage > printerData.MinPage) { 
  192.         printerData.FromPage--;
  193.         printerData.ToPage--;
  194.  
  195.         Page1->SetPageNumber(printerData.FromPage);
  196.         if (Page2)
  197.             Page2->SetPageNumber(printerData.ToPage);
  198.     }
  199.  
  200.     SpeedBarState();
  201. }
  202.  
  203.  
  204. void PreviewWindow::PPR_Next ()
  205. {
  206.     TPrintDialog::TData &printerData = Printer->GetSetup();
  207.  
  208.     if (printerData.ToPage < printerData.MaxPage) {
  209.         printerData.FromPage++;
  210.         printerData.ToPage++;
  211.  
  212.         Page1->SetPageNumber(printerData.FromPage);
  213.         if (Page2)
  214.             Page2->SetPageNumber(printerData.ToPage);
  215.     }
  216.  
  217.     SpeedBarState();
  218. }
  219.  
  220.  
  221. void PreviewWindow::PPR_OneUp ()
  222. {
  223.     if (Page2) {
  224.         Client->RemoveChildLayoutMetrics(*Page2);
  225.  
  226.         delete Page2;
  227.         Page2 = 0;
  228.  
  229.         Client->Layout();
  230.  
  231.         TPrintDialog::TData &printerData = Printer->GetSetup();
  232.         printerData.ToPage = printerData.FromPage;
  233.  
  234.         SpeedBarState();
  235.     }
  236. }
  237.  
  238.  
  239. void PreviewWindow::PPR_TwoUpEnable (TCommandEnabler &tce)
  240. {
  241.     // Two up is only available for portrait mode.
  242.     tce.Enable(PrintExtent->cx <= PrintExtent->cy);
  243. }
  244.  
  245.  
  246. void PreviewWindow::PPR_TwoUp ()
  247. {
  248.     if (Page2 == 0) {
  249.         Page2 = new TPreviewPage(Client, *Printout, *PrnDC, *PrintExtent, PageNumber + 1);
  250.         Page2->Create();
  251.  
  252.         TLayoutMetrics metrics2;
  253.  
  254.         metrics2.X.Set(lmLeft, lmRightOf, Page1, lmRight, 30);
  255.         metrics2.Y.SameAs(Page1, lmTop);
  256.  
  257.         // Assume portrait
  258.         //
  259.         metrics2.Width.SameAs(Page1, lmWidth);
  260.         metrics2.Height.SameAs(Page1, lmBottom);
  261.  
  262.         Client->SetChildLayoutMetrics(*Page2, metrics2);
  263.         Client->Layout();
  264.  
  265.         TPrintDialog::TData &printerData = Printer->GetSetup();
  266.  
  267.         // Page 2 is the next page.  If the